|
| Date :................................ 20 septembre
1992 Programme : ......................SEVEN COLORS Protection : ..........................MOT DE PASSE Outils : ................................SOFT-ICE V2.50 Temps passé : ...........................15 MINUTES Fichier : ...................................TATOU.COM Société : ..............................INFOGRAMME Divers :...Compacté par un compacteur maison. Origine :................................................... B.Y. Numéro : ..................................................184 |
Ayant recraché le hard j'ai perdu ce DEP en même temps que celui de SUPERTETRIS ( recracké depuis ). J'ai retrouvé ce DEP par l'intermédiaire d'un de mes coress ( notemment Mr B.Y ) je l'ai donc "raccroché" à la fin de ce fichier. Ce produit comme tous les TATOU est crypté sans utiliser LZ91 ou PKLITE. Ceci signifie qu'une seule solution ( la plus rapide ) est à employer: le détournement de l'int 1C ou l'int hard du clavier ( 9 ). Voici donc rapidement comment y arriver: A l'endroit de la demande du code, la touche ESPACE permet d'arriver à CS:B208 et de continuer. CS=1027 CS:B206 7403 JZ B20B ; Si barre d'espace on continue par CS:B208 E90300 JMP B20E ; B20E sinon on revient par B0B8. CS:B20B E9AAFE JMP B0B8 CS:B20E ...... suite On arrive plus loin à quelque chose qui frappe l'oeil: On place 0 dans AX dans un cas et 1 dans un autre. En faisant un essai on s'aperçoit que la bonne réponse passe par B27A qui mettra 0000 dans AX puis des POPs et REFT. Il suffit donc d'annuler le test en B278 par une inversion, un autre saut direct, ou plus simplement des NOPs. CS:B278 7503 JNZ B27D ; Saut à annuler par des 9090. CS:B27A E91E00 JMP B29B ; C'est ici qu'il faut aller si OK. CS:B27D ...... Mauvaise réponse. : : CS:B295 B80100 MOV AX,0001 CS:B298 E90600 JMP B2A1 CS:B29B B80000 MOV AX,0000 CS:B29E E90000 JMP B2A1 CS:B2A1 5F POP DI : : CS: RETF Ci-dessous le lançeur TATOU.COM qui remnplace 7503 par 9090 en CS:B278.
; PATCH POUR LE PROGRAMME SEVEN COLORS DE INFOGRAMME
; DETOURNEMENT DE L'INT 1C
;
;******************************************************************************
; ZONE A INITIALISER
adr_ip1 equ 0b278h ; adresse dont le contenu est à modifier.
anc_val equ 0375h ; Valeur d'origine à rechercher, inversée.
nouv_val equ 9090h ; Nouvelle valeur,inversée.
INT_DET equ 1Ch ; Le numéro de l'INT que l'on veut utiliser.
BEEP_TONE equ 440 ; Fréquence de la note.
;******************************************************************************
seg_a segment byte public
assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
org 100h
sto proc far
start:
jmp init ; réduire la mémoire et déplacer la
db 90h ; pile plus près.
paramet dw 0 ; Même bloc d'environnement.
ENVIR dw 0 ; Les paramètres de la ligne de
data_3 dw 0 ; commande sont recopiés ici puis
FCB_1 dw 0 ; transmis au programme fils. ( 80h )
data_5 dw 0
FCB_2 dw 0
data_7 dw 0
sauve_SP dw 0
sauve_SS dw 0
data_9 dw 0, 0
drap equ 0
;------------------------------ PROGRAMME PERE ------------------------------
loc_1: mov sauve_SP,sp
mov sauve_SS,ss
mov ax,80h
mov ENVIR,ax ; Ligne de commande...
mov data_3,ds
mov ax,5Ch ; Premier FCB ( inutilisé )
mov FCB_1,ax
mov data_5,ds
mov ax,6Ch ; Second FCB ( inutilisé )
mov FCB_2,ax
mov data_7,ds
mov ah,35h
mov al,INT_DET
int 21h ; DOS Services ah=function 35h
; get intrpt vector al in es:bx
mov cs:data_9,bx
mov word ptr cs:data_9+2,es
mov ah,25h
mov al,INT_DET
lea dx,cs:[_int] ; Load effective addr
int 21h ; DOS Services ah=function 25h
; set intrpt vector al to ds:dx
lea dx,cs:[nom_prg] ; Load effective addr
push ds
pop es
lea bx,cs:[paramet] ; Load effective addr
mov al,0
mov ah,4Bh
int 21h ; Appel du programme fils.
; run progm @ds:dx, parm @es:bx
mov sp,sauve_SP
mov ss,sauve_SS
cmp al,2 ; teste le code de retour du programme
jnz ok ; fils, 02 si pas trouvé.
mov dx,offset mess_err
mov ah,9
int 21h
; Les cinq instructions suivantes sont facultatives puisque le
; vecteur d'origine est remis en place dès que le patch est effectué.
; Le seul but est d'éviter le plantage du PC dans l'hypothèse o l'on
; lance le programme père et que celui-ci ne trouve pas le programme
; fils. A ce moment là on remet tout en place et on quitte.
ok: mov ah,25h
mov al,INT_DET
mov dx,cs:data_9
mov ds,word ptr cs:data_9+2
int 21h
mov ah,4Ch
int 21h ; terminate with al=return code
sto endp
;---------------------------- int détournée --------------------------------
int_entry proc far
_int: jmp apres
_SAUVE_SP dw 0,0
apres: push ax
push ds
push bx
push cx
push dx
pushf ; Push flags
mov dx,305h
in al,dx
mov word ptr cs:[_SAUVE_SP],sp
mov cx,30
prochain: pop ds
dec cx
jz s
cmp word ptr ds:[adr_ip1],anc_val ; Si ok on patche.
jnz prochain
mov word ptr ds:[adr_ip1],nouv_val ; On y place le patch.
xor bx,bx
mov ds,bx
; L'INT 21 n'est pas réentrante, on ne peut donc pas se servir de
; la fonction 25h ( set int. vector )
mov bx,word ptr cs:data_9 ; Je remets manuellement
mov ds:[INT_DET*4],bx ; en place le vecteur
mov bx,word ptr cs:data_9+2 ; de l'INT détournée.
mov ds:[INT_DET*4+2],bx
mov dx,304h
in al,dx
;* Sound - Sounds speaker with the following tone and duration:
mov al, 0B6h ; Initialize channel 2 of
out 43h, al ; timer chip
mov dx, 12h ; Divide 1,193,180 hertz
mov ax, 34DCh ; (clock frequency) by
mov bx, BEEP_TONE ; desired frequency
div bx ; Result is timer clock count
out 42h, al ; Low byte of count to timer
mov al, ah
out 42h, al ; High byte of count to timer
mov bx,3 ; Charge BX avec 3 BEEPs
main_b: in al, 61h ; Read value from port 61h
or al, 3 ; Set first two bits
out 61h, al ; Turn speaker on
mov dx,3
rebou: mov cx, 0ffffh
bou: loopnz bou
dec dx
jnz rebou
in al, 61h ; When time elapses, get port value
xor al, 3 ; Kill bits 0-1 to turn
out 61h, al ; speaker off
dec cx
bou1: loopnz bou1
dec bx ; Compteur de boucle.
jnz main_b ; Trois bips...
s: mov sp,word ptr cs:[_SAUVE_SP]
popf
pop dx
pop cx
pop bx
pop ds
pop ax
jmp dword ptr cs:data_9
int_entry endp
;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------
init: ; Décodage du texte.
cld ; Pour incrémenter SI et DI.
xor ax,ax
mov si,offset chaine ; pointe sur le début de la chaine.
mov di,si ; DI également.
mov cx,offset chaine_fin - offset chaine
; 28 lignes de 6 caractères sont XORés.
; + mess_err ( 30 ) + nom_prog ( 13 ).
toto: lodsb ; On cherche...
xor al,ah ; On XOR.
stosb ; On remet.
xchg ah,al
loop toto ; Et on tourne tant que CX # 0.
mov ax,1a00h ; Test si carte + moniteur VGA
int 10h
cmp al,1ah
je graf ; Si oui on affiche la fenêtre FREDDY_SOFT.
suite1: mov ah,4ah
mov bx,offset fin ; Fin du programme en BX.
mov cl,4 ; Divisé par 4 pour avoir des paragraphes.
shr bx,cl
inc bx ; On en rajoute un par sécurité.
int 21h ; Execution de la fonction 4Ah.
mov sp,offset fin ; on déplace la pile en "fin" car elle est
jmp loc_1 ; placée en FFFE dans un programme COM.
graf: xor ah,ah ; Raz de l'écran
mov al,3
int 10h
mov ax,1301h ; Mode 01 attribut couleur dans BL.
mov bx,004bh ; Page 0.
mov cx,28 ; nombre de char.
mov dx,0a19h ; ligne,colonne.
lea bp,cs:[chaine]
ligne_suiv: int 10h
inc dh
add bp,28
cmp dh,10h ; 6 lignes de 28 caractères.
jb ligne_suiv
mov ah,2 ; Pour faire disparaitre le curseur.
xor bh,bh ; Page ecran 0.
mov dh,25
int 10h
xor ah,ah
int 16h ; Attends un char...
jmp suite1
db 55h,0aah ; Identificateur de début.
chaine: db 'ÚÄÄÄÄÄÄÄFREDDY_SOFT!ÄÄÄÄÄÄÄ¿'
db '³ ³'
db '³ SEVEN COLORS Bypass ³'
db "³ I hope you'll enjoy it ³"
db '³ ³'
db 'ÀÄÄ Lançeur Crypté V1.1 ÄÄÄÙ'
mess_err db 0ah,0dh,'Programme enfant non trouvé','$'
nom_prg db 'tatou.com',0,0,0,0 ; 12 car max + nul
chaine_fin: db 0aah,55h ; Identificateur de fin.
fin_init label near
;----------------------- PLACE RESERVEE POUR LA PILE ------------------------
dw 100 dup (' ')
fin equ this byte ; ici le sommet de la pile, SP.
seg_a ends
end start
Date : 13 juillet 1992
Protection : MOT DE PASSE
Programme : 7COLORS
Outils : SOFT-ICE V2.50
Fichier : Probablement COLORS.CC1
Temps passé : 20 MINUTES
Société : INFOGRAMES
Divers : Chaine crypté, utilisation d'un lançeur
Numéro : 183
O l'on tombe en moins de deux minutes sur le saut fatidique, mais
ce dernier est crypté comme tous les fichiers d'INFOGRAMES.
On trouve bien trois octets correspondant à la chaine seize fois de
suite dans le fichier COLORS.CC1 mais il est plus rapide d'adapter
l'un de mes lanceurs que de faire un patch seize fois de suite.
De plus les octets en amont et en aval ne "collent" pas.
Il est vrai que dans le fichier codé d'ETERNAM celà a fonctionné alors
que la méthode du lançeur ne fonctionne pas du tout. ( salade faite
avec SS:SP ) Dans le cas présent on quitte simplement la routine
de demande du mot de passe par un RETF pour se retrouver dans le bon
segment IP.
On pourrait essayer la méthode suivante :
- SAUVEGARDER le fichier COLORS.CC1.
B: - Chercher avec PCTOOLS la récurrence N de ( 7503E9 ).
- Patcher avec 9090.
- Sauver.
- Essayer le jeu.
- Si OK ---> FIN
- Sinon recopier le fichier original sur le fichier modifié.
- Incrémenter N
- Si N = 16 ---> FIN
- Sinon GOTO B
FIN: - Et il n'est pas évident que celà fonctionne !
CS=19F0
CS:B272 25FF00 AND AX,00FF
CS:B275 3946D4 CMP [BP-2C],AX
CS:B278 7503 JNZ B27D ; A NOPER ( 9090 )
CS:B27A E91E00 JMP B29B
CS:B27D B80600 MOV AX,0006
Il est nécessaire de tester dans le lanceur le mot situé en B27A sous
peine de déclencher le patch bien plus tot que prévu.
; PATCH POUR LE PROGRAMME 7COLORS
; DETOURNEMENT DE L'INT 1C
;
;*****************************************************************************
; ZONE A INITIALISER
adr_ip1 equ 0b278h ; adresse dont le contenu est à modifier.
; Cette valeur est "directe"
anc_val equ 0375h ; Valeur d'origine à rechercher.
; Celle-ci doit être inversée ( HB avec LB )
anc_val_plus2 equ 1ee9h ; Mot suivant. ( inversé )
nouv_val equ 9090h ; Nouvelle valeur.
; Celle-ci doit être inversée ( HB avec LB )
INT_DET equ 1Ch ; Le numéro de l'INT que l'on veut utiliser.
BEEP_TONE EQU 440 ; Beep tone in hertz
BEEP_DURATION EQU 0ffffh
;CARTE_OUT_AL equ 1 ; Si 1 on assemble avec le test en IO 300h
;*****************************************************************************
seg_a segment byte public
assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
.
.
commun à tous mes lançeurs...
.
.
org 100h
sto endp
;---------------------------- int détournée --------------------------------
int_entry proc far
_int: jmp _sp ; On contourne...
_SAUVE_SP dw 0,0 ; SP est sauvé dans l'int dét.
_sp: push ax
push ds
push bx
push cx
push dx
pushf ; Push flags
ifdef CARTE_OUT_AL
mov dx,300h
xor al,al
out dx,al ; Allume les 8 leds.
else
mov dx,301h ; Test pour la carte PANO_AT
out dx,al ; RAZ du LS393.
endif
mov word ptr cs:[_SAUVE_SP],sp
mov cx,25
prochain: pop ds
dec cx
ifdef CARTE_OUT_AL
else
mov dx,300h
out dx,al ; Compte le nombre de dépilage
; de SP.
endif
jz s
cmp word ptr ds:[adr_ip1],anc_val ; Si ok on patche.
jnz prochain
cmp word ptr ds:[adr_ip1+2],anc_val_plus2
jnz prochain
mov word ptr ds:[adr_ip1],nouv_val ; On y place le patch.
xor bx,bx
mov ds,bx
; L'INT 21 n'est pas réentrante, on ne peut donc pas se servir de
; la fonction 25h ( set int. vector )
mov bx,word ptr cs:data_9 ; Je remets manuellement
mov ds:[INT_DET*4],bx ; en place le vecteur
mov bx,word ptr cs:data_9+2 ; de l'INT détournée.
mov ds:[INT_DET*4+2],bx
ifdef CARTE_OUT_AL
mov dx,300h
mov al,0ffh ; Carte OUT_AL
out dx,al ; Etteint les 8 leds.
endif
;* Sound - Sounds speaker with the following tone and duration:
.
.
.
routine sonore commune...
.
.
.
s: mov sp,word ptr cs:[_SAUVE_SP]
popf
pop dx
pop cx
pop bx
pop ds
pop ax
jmp dword ptr cs:data_9
int_entry endp
;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------
.
.
.
.
.
mess_err db 0ah,0dh,'Placez-moi dans le bon répertoire SVP...','$'
nom_prg db 'tatou.com',0,0,0,0 ; 12 car max + nul
chaine_fin: db 0aah,55h ; Identificateur de fin.
fin_init label near
;----------------------- PLACE RESERVEE POUR LA PILE ------------------------
dw 100 dup (' ')
fin equ this byte ; ici le sommet de la pile, SP.
seg_a ends
end start
FREDDY